home *** CD-ROM | disk | FTP | other *** search
- IF1
- INCLUDE OPTMAC.LIB
- ENDIF
- GENOPT ASDNORP
- GENOPT TX
- FOPT EQU POPT XOR DOPT XOR SOPT XOR ROPT XOR AOPT
- LF EQU 0AH
- CR EQU 0DH
-
- CODE SEGMENT
- ASSUME CS:CODE,DS:CODE
- ORG 100H
- START: JMP L023C
- OPFLAG DB 0
- LINECT DB 0
- CURLIN DB 0
- OPFLG2 DB 0
- DIRFLAG DB 0
- FILECT DW 0
- TOTSIZ DW 0,0
- TOTRSZ DW 0,0
- ROUNDER DW 0
- L01C0 DB 'Needs DOS 2.0 +$'
- L01EB DB 'Incorrect File Spec$'
- L0205 DB 9,' ,;=',CR
- L0213 DB ' $'
- L0218 DB ' Arc$'
- DB ' Dir$'
- DB ' Vol$'
- DB ' Sys$'
- DB ' Hid$'
- DB ' R-O$'
- DTAFLAG DB 0
- DOTFLAG DB 0
- DDFLAG DB 0
- FFLAG DB 1
- AMBFLAG DB 0
- MYDATE DB ' '
- MYCC DW ?
- MYYY DW ?
- DB '-'
- MYMO DW ?
- DB '-'
- MYDD DW ?
- MYTIME DB ' '
- MYHH DW ?
- DB ':'
- MYMI DW ?
- DB ':'
- MYSS DW ?
- DB '$'
- DB ' '
- MYSIZE DB 9 DUP(?)
- DB '$ '
- MYRSZE DB 9 DUP(?)
- DB 'K$'
- L0238 DW ?
- L023A DW ?
- L023C: MOV AH,30H
- INT 21H
- CMP AL,2
- JNB L024D
- MOV DX,OFFSET L01C0
- L0247: MOV AH,9
- INT 21H
- MOV AX,4C02H
- INT 21H
- L024D: MOV SI,81H
- MOV AX,CS
- MOV SS,AX
- MOV SP,OFFSET LOCAL_STACK
- MOV DS,AX
- MOV ES,AX
- MOV BX,OFFSET LOCAL_STACK+15
- MOV CL,4
- SHR BX,CL
- MOV AH,4AH
- INT 21H
- JNC NOALCERR
- MOV DX,OFFSET MSG1
- MOV AH,9
- INT 21H
- INT 20H
- NOALCERR:
- MOV CX,5
- CALL L0251
- DEC SI
- MOV L0238,SI
- MOV DI,OFFSET (L0373+43)
- CMP BYTE PTR 1[SI],':'
- JZ NOTDEF
- MOV AH,25
- INT 21H
- ADD AL,'A'
- MOV AH,':'
- JMP SHORT GOTDEF
- NOTDEF: LODSW
- GOTDEF: STOSW
- PUSH AX
- MOV DL,AL
- AND DL,1FH
- MOV AH,54
- INT 21H
- SUB DX,DX
- MUL CX
- DEC AX
- MOV ROUNDER,AX
- MOV AL,[SI]
- MOV [DI],AL
- CMP AL,'\'
- POP AX
- JZ L029E
- MOV BYTE PTR [DI],'\'
- INC DI
- MOV BYTE PTR [DI],0
- PUSH SI
- MOV SI,DI
- SUB AL,'@'
- MOV DL,AL
- MOV AH,71
- INT 21H
- POP SI
- CMP BYTE PTR [DI],0
- JZ NOPATH
- XCHG SI,DI
- BYPATH: LODSB
- OR AL,AL
- JNZ BYPATH
- XCHG SI,DI
- NOPATH: DEC DI
- MOV AL,'\'
- STOSB
- MOV L023A,DI
- L029E: LODSB
- STOSB
- PUSH DI
- MOV DI,OFFSET L0205
- MOV CX,6
- REPNZ SCASB
- POP DI
- JNZ CHKOPT
- JMP L02CA
- CHKOPT: CMP AL,'/'
- JNZ NOOPT
- JMP GOTOPT
- NOOPT: CMP AL,'\'
- JZ L02C8
- CMP AL,'*'
- JZ L02C9
- CMP AL,'?'
- JZ L02C9
- CMP AL,'.'
- JZ GOTDOT
- COMDOT: MOV DTAFLAG,1
- JMP L029E
- GOTDOT: MOV DOTFLAG,AL
- CMP BYTE PTR [SI],'.'
- JZ TWODOT
- CMP DTAFLAG,0
- JNZ L029E
- PUSH SI
- MOV AH,'*'
- ADDIN: MOV -1[SI],AH
- MOV AH,AL
- LODSB
- CMP AL,13
- JNZ ADDIN
- XCHG AH,AL
- MOV -1[SI],AX
- POP SI
- INC SI
- DEC DI
- MOV AX,'.*'
- STOSW
- L02C9: MOV AMBFLAG,AL
- JMP COMDOT
- TWODOT: CMP DTAFLAG,0
- JNZ BD1
- INC SI
- CALL GETBAK
- JC BD1
- CALL GETBAK
- JC BD1
- MOV L023A,DI
- MOV DDFLAG,1
- JMP COMDOT
- BD1: JMP L02E8
- L02C8: MOV L023A,DI
- MOV DTAFLAG,0
- MOV DOTFLAG,0
- MOV DDFLAG,0
- MOV AMBFLAG,0
- JMP L029E
- GOTOPT: PUSH SI
- GOTOP1: LODSB
- AND AL,5FH
- CMP AL,'B'
- JZ SETB
- CMP AL,'C'
- JZ SETC
- TESTOP ASDNORPF,SETA
- TESTOP TX,SETT
- CALL TSTVAL
- MOV AH,AL
- NXTLCT: LODSB
- CMP AL,'/'
- JZ SETLCT
- CMP AL,13
- JZ SETLCT
- CALL TSTVAL
- MOV BH,AH
- ADD AH,AH
- ADD AH,AH
- ADD AH,BH
- ADD AH,AH
- ADD AH,AL
- JMP NXTLCT
- SETLCT: MOV LINECT,AH
- MOV CURLIN,AH
- DEC SI
- JMP SHORT NEXTOPT
- BADOPT: MOV DX,OFFSET BOM1
- JMP L0247
- SETB: XOR DIRFLAG,0FFH
- JMP SHORT NEXTOPT
- SETC: MOV OPFLAG,0
- MOV DIRFLAG,0
- JMP SHORT NEXTOPT
- SETA: XOR OPFLAG,AH
- JMP SHORT NEXTOPT
- SETT: XOR OPFLG2,AH
- JMP SHORT NEXTOPT
- BOM1 DB 'Bad option selected',CR,LF,'$'
- TSTVAL: DEC SI
- LODSB
- SUB AL,'0'
- JB BADOPT
- CMP AL,9
- JA BADOPT
- RET
- NEXTOPT:
- LODSB
- CMP AL,'/'
- JNZ GOTOP2
- JMP GOTOP1
- GOTOP2: MOV AL,NOPT+OOPT
- AND AL,OPFLAG
- CMP AL,NOPT+OOPT
- JNZ L02CB
- XOR OPFLAG,AL
- L02CB: POP SI
- L02CA:
- DEC SI
- DEC DI
- CMP DTAFLAG,0
- JZ NOCDIR
- CMP DIRFLAG,0
- JNZ NOCDIR
- CMP AMBFLAG,0
- JNZ NOCDIR
- MOV BYTE PTR [SI],0
- MOV DX,L0238
- MOV AX,4300H
- INT 21H
- TEST CX,10H
- JZ NOCDIR
- MOV BYTE PTR [SI],'\'
- MOV BYTE PTR 1[SI],13
- MOV DTAFLAG,0
- MOV DOTFLAG,0
- MOV DDFLAG,0
- JMP L024D
- NOCDIR: CMP DTAFLAG,0
- JNZ NODTA
- MOV AL,'*'
- STOSB
- MOV [SI],AL
- INC SI
- NODTA: CMP DOTFLAG,0
- JNZ NODOT
- MOV AX,'*.'
- STOSW
- MOV [SI],AX
- INC SI
- INC SI
- NODOT: SUB AL,AL
- STOSB
- MOV [SI],AL
- MOV DX,OFFSET L0373
- MOV AH,26
- INT 21H
- MOV DX,L0238
- MOV CX,1FH
- MOV AH,4EH
- L02DC: INT 21H
- JNB L02EE
- CMP AX,18
- JNZ L02E8
- JMP L0366
- L02E8: MOV DX,OFFSET L01EB
- JMP L0247
- L02EE:
- TEST OPFLAG,NOPT+OOPT
- JZ L02EF
- TEST OPFLAG,NOPT
- JNZ L02EG
- TEST BYTE PTR (L0373+21),18H
- JNZ NO3611
- JMP L0361
- NO3611: JMP SHORT L02EF
- L02EG:
- TEST BYTE PTR (L0373+21),18H
- JZ L02EF
- JMP L0361
- L02EF: MOV SI,OFFSET (L0373+30)
- CMP BYTE PTR [SI],'.'
- JNZ L03612
- JMP L0361
- L03612: MOV FFLAG,0
- ADD FILECT,1
- MOV AX,WORD PTR (L0373+26)
- MOV DX,WORD PTR (L0373+28)
- ADD TOTSIZ,AX
- ADC TOTSIZ+2,DX
- ADD AX,ROUNDER
- ADC DX,0
- OR AX,ROUNDER
- XOR AX,ROUNDER
- ADD TOTRSZ,AX
- ADC TOTRSZ+2,DX
- TEST OPFLG2,XOPT
- JZ L03613
- JMP L0361
- L03613:
- MOV DI,L023A
- TEST OPFLAG,POPT
- JZ NOPDSP
- PUSH SI
- MOV CX,DI
- MOV SI,OFFSET (L0373+43)
- SUB CX,SI
- DPLP: LODSB
- CALL L0368
- LOOP DPLP
- POP SI
- NOPDSP: MOV CX,12
- L0300: LODSB
- STOSB
- OR AL,AL
- JZ L030B
- CALL L0368
- LOOP L0300
- L030B:
- TEST OPFLAG,FOPT-POPT
- JZ L0351
- TEST OPFLAG,POPT
- JZ NOPOPT2
- CALL CRLF
- MOV CX,1
- NOPOPT2:
- OR CX,CX
- JZ L030DB
- CALL DSPSPA
- L030DB:
- TEST OPFLAG,DOPT
- JZ NODATE
- CALL DSPDAT
- NODATE:
- TEST OPFLAG,ROPT
- JZ NORSZE
- CALL DSPRSZ
- NORSZE:
- TEST OPFLAG,SOPT
- JZ NOSIZE
- CALL DSPSIZ
- NOSIZE:
- TEST OPFLAG,AOPT
- JZ L0351
- CALL DSPATT
- L0351:
- CALL CRLF
- L0361: MOV AH,4FH
- JMP L02DC
- GETBAK: DEC DI
- CMP BYTE PTR [DI],'\'
- JZ GBXIT
- CMP BYTE PTR [DI],':'
- JNZ GETBAK
- STC
- GBXIT: RET
- DSPSPA: MOV AL,' '
- L030D:
- CALL L0368
- LOOP L030D
- RET
- DSPDAT: MOV DX,WORD PTR (L0373+24)
- MOV AX,DX
- MOV BH,10
- AND AX,31
- DIV BH
- ADD AX,3030H
- MOV MYDD,AX
- MOV AX,DX
- MOV CL,5
- SHR AX,CL
- AND AX,15
- DIV BH
- ADD AX,3030H
- MOV MYMO,AX
- MOV AX,DX
- MOV CL,9
- SHR AX,CL
- ADD AX,1980
- SUB DX,DX
- MOV CX,100
- DIV CX
- DIV BH
- ADD AX,3030H
- MOV MYCC,AX
- MOV AX,DX
- DIV BH
- ADD AX,3030H
- MOV MYYY,AX
- MOV DX,WORD PTR (L0373+22)
- MOV AX,DX
- AND AX,31
- ROL AX,1
- DIV BH
- ADD AX,3030H
- MOV MYSS,AX
- MOV AX,DX
- MOV CL,5
- SHR AX,CL
- AND AX,63
- DIV BH
- ADD AX,3030H
- MOV MYMI,AX
- MOV AX,DX
- MOV CL,11
- SHR AX,CL
- DIV BH
- ADD AX,3030H
- MOV MYHH,AX
- MOV DX,OFFSET MYDATE
- MOV AH,9
- INT 21H
- RET
- DSPSIZ: MOV AX,WORD PTR (L0373+26)
- MOV DX,WORD PTR (L0373+28)
- MOV DI,OFFSET MYSIZE
- CALL SENDIT
- MOV DX,OFFSET MYSIZE-1
- TEST BYTE PTR (L0373+21),18H
- JZ RSCOM
- MOV MYSIZE+8,' '
- RSCOM: MOV AH,9
- INT 21H
- RET
- DSPRSZ: MOV AX,WORD PTR (L0373+26)
- MOV DX,WORD PTR (L0373+28)
- ADD AX,ROUNDER
- ADC DX,0
- OR AX,ROUNDER
- XOR AX,ROUNDER
- ADD AX,1023
- ADC DX,0
- MOV CX,10
- GETK: SHR DX,1
- RCR AX,1
- LOOP GETK
- MOV DI,OFFSET MYRSZE
- CALL SENDIT
- MOV DX,OFFSET MYRSZE+2
- MOV BYTE PTR MYRSZE+9,'K'
- TEST BYTE PTR (L0373+21),18H
- JZ RSCOM
- MOV WORD PTR MYRSZE+8,' '
- JMP RSCOM
- SENDIT: MOV BX,10000
- DIV BX
- PUSH AX
- PUSH DX
- MOV AX,' '
- STOSW
- STOSW
- POP AX
- PUSH DI
- CALL DSPVAL
- POP DI
- POP AX
- OR AX,AX
- JZ DVXIT
- PUSH AX
- MOV SI,DI
- FILLX: LODSB
- CMP AL,' '
- JNZ NOFILL
- MOV BYTE PTR -1[SI],'0'
- JMP FILLX
- NOFILL: POP AX
- JMP SHORT DVLP
- DSPVAL: PUSH AX
- MOV AX,' '
- STOSW
- STOSW
- MOV BYTE PTR [DI],'0'
- POP AX
- DVLP: OR AX,AX
- JNZ DSPDIG
- DVXIT: RET
- DSPDIG: CALL DIV10
- MOV [DI],DL
- DEC DI
- JMP DVLP
- DIV10: SUB DX,DX
- MOV BX,10
- DIV BX
- OR DL,30H
- RET
- DSPATT: MOV CL,BYTE PTR (L0373+21)
- OR CL,CL
- JZ DSPXIT
- MOV BL,CL
- SHL BL,1
- SHL BL,1
- MOV CX,6
- MOV DX,OFFSET L0218
- L0345: PUSH DX
- SHL BL,1
- JB L034D
- MOV DX,OFFSET L0213
- L034D: MOV AH,9
- INT 21H
- POP DX
- ADD DX,5
- LOOP L0345
- DSPXIT: RET
- CRLF: MOV AL,CR
- CALL L0368
- MOV AL,LF
- CALL L0368
- CMP LINECT,0
- JZ XCRLF
- DEC CURLIN
- JNZ XCRLF
- MOV AH,LINECT
- MOV CURLIN,AH
- MOV AH,7
- INT 21H
- CMP AL,3
- JZ L0366
- AND AL,5FH
- CMP AL,'S'
- JNZ XCRLF
- JMP SHELL
- XCRLF: RET
- L0366:
- MOV LINECT,0
- TEST OPFLG2,TOPT+XOPT
- JNZ NOL03614
- JMP L03614
- NOL03614:
- MOV CX,12
- MOV AX,FILECT
- MOV DX,0
- MOV DI,OFFSET MYSIZE
- CALL SENDIT
- MOV SI,OFFSET MYSIZE-1
- L0500: LODSB
- CMP AL,' '
- JZ L0500
- CMP AL,'$'
- JZ L050B
- CALL L0368
- LOOP L0500
- L050B:
- TEST OPFLAG,FOPT-POPT
- JZ NOSIZE2
- TEST OPFLAG,POPT
- JZ NOPOPT3
- CALL CRLF
- MOV CX,1
- NOPOPT3:
- OR CX,CX
- JZ L050DB
- CALL DSPSPA
- L050DB:
- TEST OPFLAG,DOPT
- JZ NODATE2
- MOV CX,20
- CALL DSPSPA
- NODATE2:
- TEST OPFLAG,ROPT
- JZ NORSZE2
- MOV MYRSZE+9,'K'
- MOV AX,TOTRSZ
- MOV DX,TOTRSZ+2
- ADD AX,1023
- ADC DX,0
- MOV CX,10
- GETK2: SHR DX,1
- RCR AX,1
- LOOP GETK2
- MOV DI,OFFSET MYRSZE
- CALL SENDIT
- MOV DX,OFFSET (MYRSZE+2)
- MOV AH,9
- INT 21H
- NORSZE2:
- TEST OPFLAG,SOPT
- JZ NOSIZE2
- MOV AX,TOTSIZ
- MOV DX,TOTSIZ+2
- MOV DI,OFFSET MYSIZE
- CALL SENDIT
- MOV DX,OFFSET (MYSIZE-1)
- MOV AH,9
- INT 21H
- NOSIZE2:
- CALL CRLF
- L03614:
- MOV AL,FFLAG
- MOV AH,76
- INT 21H
- L0368: PUSH AX
- PUSH DX
- MOV DL,AL
- MOV AH,2
- INT 21H
- POP DX
- POP AX
- RET
- L0251: LODSB
- MOV DI,OFFSET L0205
- PUSH CX
- REPNZ SCASB
- POP CX
- JZ L0251
- RET
- SHELL: PUSH AX
- PUSH BX
- PUSH CX
- PUSH DX
- PUSH SI
- PUSH DI
- PUSH BP
- MOV AH,47
- INT 21H
- PUSH BX
- MOV STKPTR,SP
- MOV AX,CS
- MOV PARBLK+4,AX
- MOV PARBLK+8,AX
- MOV PARBLK+12,AX
- MOV DX,OFFSET MSG4
- MOV AH,9
- INT 21H
- MOV CX,L023A
- MOV SI,OFFSET (L0373+43)
- MOV DI,OFFSET (CMDDTA+1)
- SUB CX,SI
- PUSH CX
- CALL SENDEM
- MOV SI,OFFSET (L0373+30)
- MOV CX,12
- CALL SENDEM
- MOV BYTE PTR [DI],CR
- MOV AX,12
- SUB AX,CX
- POP CX
- ADD AX,CX
- MOV CMDDTA,AL
- MOV DX,OFFSET CMDBUF
- MOV AH,10
- INT 21H
- MOV DL,LF
- MOV AH,2
- INT 21H
- MOV AL,CMDDTA
- MOV CMDLIN,AL
- OR AL,AL
- JZ NOSETUP
- MOV SI,OFFSET PREFMSG
- MOV DI,OFFSET CMDLIN
- ADD AL,4
- STOSB
- MOVSW
- MOVSW
- NOSETUP:
- MOV AX,DS:[2CH]
- MOV DS,AX
- MOV SI,0
- MOV DI,OFFSET COMSPEC
- LOOP1: PUSH DI
- PUSH SI
- MOV CX,4
- REP CMPSW
- JZ GOTSPEC
- POP SI
- POP DI
- LOOP2: LODSB
- OR AL,AL
- JNZ LOOP2
- MOV AL,[SI]
- OR AL,AL
- JNZ LOOP1
- MOV AX,CS
- MOV DS,AX
- MOV DX,OFFSET MSG2
- MOV AH,9
- INT 21H
- INT 20H
- GOTSPEC:
- POP DI
- POP DI
- MOV DX,SI
- MOV BX,OFFSET PARBLK
- MOV AX,4B00H
- INT 21H
- MOV AX,CS
- MOV SS,AX
- MOV SP,CS:STKPTR
- MOV DS,AX
- MOV ES,AX
- POP DX
- MOV AH,26
- INT 21H
- POP BP
- POP DI
- POP SI
- POP DX
- POP CX
- POP BX
- POP AX
- JMP XCRLF
- SENDEM: LODSB
- OR AL,AL
- JZ NOSEND
- STOSB
- LOOP SENDEM
- NOSEND: RET
- STKPTR DW ?
- MSG1 DB 'Unable to release memory.$'
- COMSPEC DB 'COMSPEC='
- MSG2 DB 'COMSPEC must be set$'
- PARBLK DW 0,CMDLIN,?,FCB1,?,FCB2,?
- CMDLIN DB 0,CR,0
- CMDBUF DB 128
- CMDDTA DB 0,CR,0,128 DUP(?)
- PREFMSG DB ' /C '
- MSG4 DB 13,'Enter command for shell operation.',CR,LF,'*$'
- FCB1 DB 0,11 DUP('?'),25 DUP(0)
- FCB2 DB 0,11 DUP(' '),25 DUP (0)
- L0373 DB 5 DUP(0)
- ENDCODE DB 0
- LOCAL_STACK EQU ENDCODE+2048
- CODE ENDS
- END START
- UP(0)
- FCB2 DB 0,11 DUP(' '),25 DUP (0)
- L0373 DB 5 DUP(0)
- ENDCODE DB 0
- LOCAL_STACK EQU ENDCODE+2048
- CODE ENDS
- END ST